Флаги
O D I T S Z A P C * * * * * *
Команда:
CMPSW
Логика:
CMP (DS:SI), (ES:DI) ; только устанавливает признаки if DF = 0 SI = SI + 2 DI = DI + 2 else SI = SI - 2 DI = DI - 2
Эта команда сравнивает два значения, вычитая слово, на которое указывает ES:DI, из слова, на которое указывает DS:SI, и устанавливает флаг в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличиваются на 2, если флаг направления сброшен, или уменьшаются на 2, если флаг направления установлен. Тем самым подготавливаются к сравнению следующие элементы обеих строк.
Операнды | Такт байты (слова) | Обращения | Байты | Пример |
нет операндов | 30 | 2 | 1 | CMPSW |
(повтор) | 9+30 | /rep 2/rep | 1 | REPE CMPSW |
Пусть имеют место следующие определения :
buffer1 dw 50 dup (?) buffer2 dw 50 dup (?)
Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch):
cld ;сканируя в прямом направлении mov cx, 50 ;50 слов (CX используется в REPE), lea si, buffer1 ;начиная с 1го элемента BUFFER1 lea di, buffer2 ;и с 1го элемента BUFFER2, repe cmpsw ;сравниваем их. jne mismatch ;флаг ZF = 0, если сравниваемые ;строки не совпадают (mismatch) match: ;если мы попали сюда, значит, они ;совпадают (match) mismatch: dec si ;если мы попали сюда, то мы нашли dec si ;несовпадение, и возвращаем указатели dec di ;SI и DI обратно, чтобы они указывали dec di ;на первые несовпадающие слова.
После выхода из цикла REPE CMPSW флаг ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указывать на слова (по два байта), следующие непосредственно за словами, которые не совпали; пары команд DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие слова.